package control;
import java.io.Serializable;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.component.UIComponent;
import javax.faces.component.UIParameter;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.event.ValueChangeEvent;
import javax.faces.model.SelectItem;

import util.Convert;

import model.Evento;
import model.Visibilidade;
import business.EventoDAO;

@ManagedBean(name="eventoHandler")
@SessionScoped

public class EventoHandler implements Serializable {
	private static final long serialVersionUID = 1L;
	private EventoDAO eventoDAO = EventoDAO.getInstance();
	private Evento evento = new Evento();
	private boolean emEdicao = false;
	private Integer visibilidade = 0;
    private String data;
    private Date dataFormatada = null;   
	
	public EventoDAO getEventoDAO() {
		return this.eventoDAO;
	}
	public void setEventoDAO(EventoDAO eventoDAO) {
		this.eventoDAO = eventoDAO;
	}
	public Evento getEvento() {
		return this.evento;
	}
	public void setEvento(Evento evento) throws Exception {
		this.evento = evento;
	}
	public String novo()	{
		this.evento = new Evento();
		this.dataFormatada = null;
		this.data = null;
		this.visibilidade = 0;
		this.emEdicao = true;
		return "eventoManter";
	}
	
	public String salvar(){
		this.evento.setData(this.dataFormatada);
		this.eventoDAO.salvar(this.evento);
		FacesContext context = FacesContext.getCurrentInstance();
		context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Dados salvos com sucesso!",""));
		this.emEdicao = false;
		return "eventoManter";
	}
	
	public void editar(ActionEvent event) throws Exception {
		UIComponent link = event.getComponent();
		UIParameter param = (UIParameter) link.findComponent("editarEventoParam");
		this.evento = (Evento)param.getValue();
		this.dataFormatada = this.evento.getData();
		this.data = Convert.dateToString(dataFormatada);
		this.emEdicao = true;
	}
	
	public void excluir(ActionEvent event)	{
	    UIComponent link = event.getComponent();
		UIParameter param = (UIParameter) link.findComponent("excluirEventoParam");
		Integer id = (Integer) param.getValue();
		EventoDAO eventoDAO = EventoDAO.getInstance();
	    eventoDAO.remover(id);
		this.evento = new Evento();
		this.emEdicao = false;
		this.dataFormatada = null;
	}
	
	public List<Evento> getEventos()	{
		List<Evento> itens = eventoDAO.listar();
		return itens;
	}
	
	public boolean getEmEdicao() {
		return emEdicao;
	}
	public void setEmEdicao(boolean emEdicao) {
		this.emEdicao = emEdicao;
	}
	public boolean getEmNavegacao() {
		return !emEdicao;
	}
	public int getVisibilidade() {
		return visibilidade;
	}
	public void setVisibilidade(int visibilidade) {
		this.visibilidade = visibilidade;
	}
	
	public void receberData(ValueChangeEvent event) throws ParseException 	{
		SimpleDateFormat sf = new SimpleDateFormat("dd/MM/yyyy");
        this.data = sf.format(event.getNewValue()).toString();
	}
	
	public String getData()	{
		return data;
	}
	
	public void setData(String data) {
		this.data = data;
	}
	
	public void setDataFormatada(Date dataFormatada) {
		this.dataFormatada = dataFormatada;
	}
	
	public Date getDataFormatada() {
		return dataFormatada;
	}
	
	public List<SelectItem> getVisibilidades() {
        List<SelectItem> itens = new ArrayList<SelectItem>();
        for (Visibilidade item : Visibilidade.values()) {
        	itens.add(new SelectItem(item.getVisibilidade(), item.getDescricao()));
        }
        return itens;
    }
}
